--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_rns_filesync_handler.py e5756d7ab065475a18acdcafc008a767fcff87e0 (e5756d7a) Text, 8.80 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations
Tff7b72import T7ee787os
Tff7b72from T7ee787types Tff7b72import Te6edf3SimpleNamespace
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rns_filesync_handler Tff7b72import Te6edf3RnsFilesyncHandler
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_identityTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3SimpleNamespaceTb4b4b4(Tffa657hashTff7b72=Ta5d6ffbTa5d6ff"Tffea00\xaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffhandlerTb4b4b4(Te6edf3mock_identityTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3storage Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"
Te6edf3storageTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3RnsFilesyncHandlerTb4b4b4(
Te6edf3reticulum_instanceTff7b72=Te6edf3MagicMockTb4b4b4(Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3storageTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_default_status_not_runningTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3mock_identityTb4b4b4)Tb4b4b4:
Te6edf3status Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72None
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3mock_identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6fffilesync/syncTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fffilesyncTa5d6ff" Tff7b72in Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffconfig_directoryTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffstorage_directoryTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3handlerTff7b72.Td2a8ffstorage_dir
Tff7b72def Td2a8fftest_list_directories_missing_sync_path_falls_backTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3missing Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3handlerTff7b72.Td2a8ffstorage_dirTffd700}Ta5d6ff/filesync/sync/does-not-exist-yetTa5d6ff"
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_directoriesTb4b4b4(Te6edf3missingTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffstorage_dirTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_list_directories_defaults_to_filesync_rootTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3nested Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3handlerTff7b72.Td2a8ffstorage_dirTffd700}Ta5d6ff/filesync/photosTa5d6ff"
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nestedTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_directoriesTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6fffilesyncTa5d6ff"Tb4b4b4)
Te6edf3names Tff7b72= Tb4b4b4{Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3entry Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffdirectoriesTa5d6ff"Tb4b4b4]Tb4b4b4}
Tff7b72assert Ta5d6ff"Ta5d6ffphotosTa5d6ff" Tff7b72in Te6edf3names Tff7b72or Ta5d6ff"Ta5d6ffsyncTa5d6ff" Tff7b72in Te6edf3names
Tff7b72def Td2a8fftest_list_directories_rejects_outside_jailTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_directoriesTb4b4b4(Ta5d6ff"Ta5d6ff/tmp/outsideTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffidentity storageTa5d6ff" Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8fftest_create_directory_under_filesyncTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffcreate_directoryTb4b4b4(Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffsharedTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff"Ta5d6fffilesync/sharedTa5d6ff"Tb4b4b4)
Te6edf3listed Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_directoriesTb4b4b4(Te6edf3handlerTff7b72.Td2a8ff_rootTb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffsharedTa5d6ff" Tff7b72for Te6edf3entry Tff7b72in Te6edf3listedTb4b4b4[Ta5d6ff"Ta5d6ffdirectoriesTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_create_directory_rejects_traversal_nameTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffcreate_directoryTb4b4b4(Te6edf3handlerTff7b72.Td2a8ff_rootTb4b4b4, Ta5d6ff"Ta5d6ff../escapeTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffinvalidTa5d6ff" Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8fftest_update_settings_persists_sync_directoryTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3nested Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3handlerTff7b72.Td2a8ffstorage_dirTffd700}Ta5d6ff/filesync/altTa5d6ff"
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_settingsTb4b4b4(Te6edf3sync_directoryTff7b72=Te6edf3nestedTb4b4b4, Te6edf3monitorTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Te6edf3status Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4] Tff7b72== Te6edf3nested
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_acl_grant_and_persistTb4b4b4(Te6edf3handlerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_aclTb4b4b4(
Te6edf3identity_hashTff7b72=Te6edf3peerTb4b4b4,
Te6edf3permsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3enforceTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3peer Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3peer Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffwriteTa5d6ff"Tb4b4b4]
Te6edf3acl_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6fffilesyncTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffacl.txtTa5d6ff"
Tff7b72assert Te6edf3acl_pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)
Te6edf3text Tff7b72= Te6edf3acl_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6fffTa5d6ff"Ta5d6ffr:Tffd700{Te6edf3peerTffd700}Ta5d6ff" Tff7b72in Te6edf3text
Tff7b72assert Ta5d6fffTa5d6ff"Ta5d6ffw:Tffd700{Te6edf3peerTffd700}Ta5d6ff" Tff7b72in Te6edf3text
Te6edf3again Tff7b72= Te6edf3handlerTff7b72.Td2a8ffget_aclTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3againTb4b4b4[Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3peer Tff7b72in Te6edf3againTb4b4b4[Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffreadTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8fftest_connect_requires_runningTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffconnect_peerTb4b4b4(Ta5d6ff"Ta5d6ffccTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffnot runningTa5d6ff" Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]
Tf0883e@patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.rns_filesync_handler.FileSyncServiceTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_start_stop_and_teardownTb4b4b4(Te6edf3mock_service_clsTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3service Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffstartTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ff"Ta5d6ffddTa5d6ff" Tff7b72* T79c0ff16
Te6edf3serviceTff7b72.Td2a8ffget_statusTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4: Te6edf3handlerTff7b72.Td2a8ff_sync_directoryTb4b4b4,
Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffddTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4,
Ta5d6ff"Ta5d6ffpeersTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffwhitelistTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Tb4b4b4}
Te6edf3serviceTff7b72.Td2a8fflist_peersTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4]
Te6edf3serviceTff7b72.Td2a8fflist_filesTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4]
Te6edf3serviceTff7b72.Td2a8ffconnect_peerTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4}
Te6edf3serviceTff7b72.Td2a8ffbrowse_peerTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffremote.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: T79c0ff2Tb4b4b4}Tb4b4b4]
Te6edf3serviceTff7b72.Td2a8ffdownload_fileTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffremote.txtTa5d6ff"Tb4b4b4}
Te6edf3mock_service_clsTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3service
Te6edf3started Tff7b72= Te6edf3handlerTff7b72.Td2a8ffstartTb4b4b4(Te6edf3monitorTff7b72=Tff7b72TrueTb4b4b4, Te6edf3announce_intervalTff7b72=T79c0ff120Tb4b4b4)
Tff7b72assert Te6edf3startedTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3startedTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffddTa5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_service_clsTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3kwargs Tff7b72= Te6edf3mock_service_clsTff7b72.Td2a8ffcall_argsTff7b72.Td2a8ffkwargs
Tff7b72assert Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6ffown_reticulumTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3kwargsTb4b4b4[Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tb4b4b4] Tff7b72is Te6edf3handlerTff7b72.Td2a8ffreticulum
Te6edf3serviceTff7b72.Td2a8ffstartTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8fflist_peersTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16
Tff7b72assert Te6edf3handlerTff7b72.Td2a8fflist_filesTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffa.txtTa5d6ff"
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffconnect_peerTb4b4b4(Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffbrowse_peerTb4b4b4(Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffdownload_fileTb4b4b4(Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffremote.txtTa5d6ff"Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffannounce_nowTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffdisconnect_peerTb4b4b4(Ta5d6ff"Ta5d6ffeeTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Te6edf3stopped Tff7b72= Te6edf3handlerTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3stoppedTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3stoppedTb4b4b4[Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Te6edf3serviceTff7b72.Td2a8ffstopTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72is Tff7b72None
Te6edf3serviceTff7b72.Td2a8ffstopTff7b72.Td2a8ffreset_mockTb4b4b4(Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72= Te6edf3service
Te6edf3handlerTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Te6edf3serviceTff7b72.Td2a8ffstopTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72is Tff7b72None
Tff7b72def Td2a8fftest_settings_reject_sync_dir_change_while_runningTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffserviceTff7b72.Td2a8ffget_statusTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffupdate_settingsTb4b4b4(Te6edf3sync_directoryTff7b72=Ta5d6ff"Ta5d6ff/tmp/otherTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffstop filesyncTa5d6ff" Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8fftest_list_tree_while_stoppedTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3sync Tff7b72= Te6edf3handlerTff7b72.Td2a8ff_sync_directory
Te6edf3nested Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3syncTb4b4b4, Ta5d6ff"Ta5d6ffdocsTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nestedTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3syncTb4b4b4, Ta5d6ff"Ta5d6ffhello.txtTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nestedTb4b4b4, Ta5d6ff"Ta5d6ffnote.mdTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffnoteTa5d6ff"Tb4b4b4)
Te6edf3root Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_treeTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3rootTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3rootTb4b4b4[Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff"
Te6edf3names Tff7b72= Tb4b4b4{Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3entry Tff7b72in Te6edf3rootTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4}
Tff7b72assert Ta5d6ff"Ta5d6ffhello.txtTa5d6ff" Tff7b72in Te6edf3names
Tff7b72assert Ta5d6ff"Ta5d6ffdocsTa5d6ff" Tff7b72in Te6edf3names
Tff7b72assert Te6edf3handlerTff7b72.Td2a8ffservice Tff7b72is Tff7b72None
Te6edf3nested_list Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_treeTb4b4b4(Ta5d6ff"Ta5d6ffdocsTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nested_listTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3nested_listTb4b4b4[Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffdocsTa5d6ff"
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffnote.mdTa5d6ff" Tff7b72for Te6edf3e Tff7b72in Te6edf3nested_listTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8fftest_manager_upload_mkdir_delete_roundtripTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3mk Tff7b72= Te6edf3handlerTff7b72.Td2a8ffmanager_mkdirTb4b4b4(Ta5d6ff"Ta5d6ffphotosTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3mkTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3mkTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffphotosTa5d6ff"
Te6edf3uploaded Tff7b72= Te6edf3handlerTff7b72.Td2a8ffmanager_uploadTb4b4b4(
Te6edf3filenameTff7b72=Ta5d6ff"Ta5d6ffshot.jpgTa5d6ff"Tb4b4b4,
Te6edf3dataTff7b72=Ta5d6ffbTa5d6ff"Ta5d6ffjpeg-bytesTa5d6ff"Tb4b4b4,
Te6edf3subdirTff7b72=Ta5d6ff"Ta5d6ffphotosTa5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3uploadedTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3uploadedTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffphotos/shot.jpgTa5d6ff"
Tff7b72assert Te6edf3uploadedTb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72== Tffa657lenTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffjpeg-bytesTa5d6ff"Tb4b4b4)
Te6edf3tree Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_treeTb4b4b4(Ta5d6ff"Ta5d6ffphotosTa5d6ff"Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffshot.jpgTa5d6ff" Tff7b72for Te6edf3e Tff7b72in Te6edf3treeTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3content Tff7b72= Te6edf3handlerTff7b72.Td2a8ffmanager_contentTb4b4b4(Ta5d6ff"Ta5d6ffphotos/shot.jpgTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3contentTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3contentTb4b4b4[Ta5d6ff"Ta5d6fffilenameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffshot.jpgTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3contentTb4b4b4[Ta5d6ff"Ta5d6ffabspathTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Tff7b72assert Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffjpeg-bytesTa5d6ff"
Te6edf3deleted Tff7b72= Te6edf3handlerTff7b72.Td2a8ffmanager_deleteTb4b4b4(Ta5d6ff"Ta5d6ffphotos/shot.jpgTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3deletedTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3handlerTff7b72.Td2a8ff_sync_directoryTb4b4b4, Ta5d6ff"Ta5d6ffphotosTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshot.jpgTa5d6ff"Tb4b4b4)
Tb4b4b4)
Te6edf3empty Tff7b72= Te6edf3handlerTff7b72.Td2a8ffmanager_deleteTb4b4b4(Ta5d6ff"Ta5d6ffphotosTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3emptyTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_manager_delete_refuses_nonempty_dirTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3handlerTff7b72.Td2a8ffmanager_mkdirTb4b4b4(Ta5d6ff"Ta5d6ffkeepTa5d6ff"Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffmanager_uploadTb4b4b4(Te6edf3filenameTff7b72=Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4, Te6edf3dataTff7b72=Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4, Te6edf3subdirTff7b72=Ta5d6ff"Ta5d6ffkeepTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3handlerTff7b72.Td2a8ffmanager_deleteTb4b4b4(Ta5d6ff"Ta5d6ffkeepTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffnot emptyTa5d6ff" Tff7b72in Te6edf3resultTb4b4b4[Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3handlerTff7b72.Td2a8ff_sync_directoryTb4b4b4, Ta5d6ff"Ta5d6ffkeepTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_manager_skips_dotfiles_in_treeTb4b4b4(Te6edf3handlerTb4b4b4)Tb4b4b4:
Te6edf3sync Tff7b72= Te6edf3handlerTff7b72.Td2a8ff_sync_directory
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3syncTb4b4b4, Ta5d6ff"Ta5d6ff.secretTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffnopeTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3syncTb4b4b4, Ta5d6ff"Ta5d6ff.rns-filesync.dbTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffd700{}Ta5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3syncTb4b4b4, Ta5d6ff"Ta5d6ffvisible.txtTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4)
Te6edf3tree Tff7b72= Te6edf3handlerTff7b72.Td2a8fflist_treeTb4b4b4(Tb4b4b4)
Te6edf3names Tff7b72= Tb4b4b4{Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3e Tff7b72in Te6edf3treeTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4}
Tff7b72assert Ta5d6ff"Ta5d6ffvisible.txtTa5d6ff" Tff7b72in Te6edf3names
Tff7b72assert Ta5d6ff"Ta5d6ff.secretTa5d6ff" Tff7b72not Tff7b72in Te6edf3names
Tff7b72assert Ta5d6ff"Ta5d6ff.rns-filesync.dbTa5d6ff" Tff7b72not Tff7b72in Te6edf3names
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────